/*  一个整数，它加上100后是一个完全平方数，再加上168又是一个完全平方数，请问该数是多少？
    这个数，单纯，直接从这个整数开始解，其实是很难的，很多题目，上来就把范围限定在 小于10万，其实你凭什么这么决定？

    不过，分析一下，完全平方数，至少大于等于0

    也就是说，X >= -100
             X >= -268
             上述合并起来，就是 X >= -100 从这个题目看

    其次，设
    X + 100 = pow(a,2);
    X + 268 = pow(b,2);

    2X + 368 = pow(b,2) - pow(a,2);
    X > 
     
    pow(b,2) - pow(a,2) = 168;
    所以，|b| > |a|

    b + a , b - a 同号
    if b - a > 0, b + a > 0
    if  b - a < 0, 则 b < a
    同时b + a < 0,推出 b < -a   ，上下矛盾，由此，此情况不成立

    只有 b - a > 0，且 b + a > 0,
    b > a b > -a
    且 |b| - |a| 
    
    b + a < 168
    b - a > 1

    |a| != 0,因为如果 |a| = 0;X = -100,pow(b,2) = 168,非完全平方数，不成立
    so |a| >= 1
    b > a + 1

    同时(b + a)*(b - a) = 168;
    a b 是整数，故而 b + a,b - a 也是整数
    uint8_t i,j;
    设 |a| = i,|b| = j;

    关于这个题目，无论是我的，还是网上查到的一个比较好的答案，其实，都差一个东西
    就是判断，X不能小于 268.
    
    除此之外，我想说的就是，尽管我设置的范围不是特别小
    但是，我的确实现了比对方高得多的多效率的算法

    所以，有的时候，如果实在无法设置更小的范围，就用相对较大的范围也不是不也可以
    当然，上述的推导过程不对，也无意义——主要是，从一开始就可以设置 a b 均为正数，就好办了。
    完全合理，并且，完全可用。

    不对，不对，就是4个答案，这个X可以为负数，  大于 -100 -268
*/
#include <stdio.h>
#include <stdint.h>

void cal_perfect_square_1(void)
{
    uint8_t i,j;

    for(i = 0;i < 167;i++)
    {
        for(j = i + 1;i + j < 168;j++)
        {
            if(168 == (j - i)*(j + i))
            {
                printf("|a| = %d,|b| = %d\n",i,j);
                printf("X = %d\n",i * i - 100);
            }
        }
    }
}

#include <math.h>

void cal_perfect_square(void)
{
    int n;
    int x,y;
    for (n=-100;n<=168*168-268;n++)
    {
        x = sqrt(n+100);
        y = sqrt(n+268);
        if(n+100==x*x && n+268==y*y)
        {
            printf("n = %d\n",n);
        }
    }	
}

